/**
 * 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口，我们称之为 root 。
 *
 * 除了 root 之外，每栋房子有且只有一个“父“房子与之相连。
 *
 * 一番侦察之后，聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。
 *
 * 如果 两个直接相连的房子在同一天晚上被打劫 ，房屋将自动报警。
 *
 * 给定二叉树的 root 。返回 在不触动警报的情况下 ，小偷能够盗取的最高金额 。
 */
public class Test337 {
    public int rob(TreeNode root) {
        int[] ans = dfs(root);
        return Math.max(ans[0],ans[1]);
    }
    public int[] dfs(TreeNode root){
        if (root == null) return new int[]{0,0};
        int[] left = dfs(root.left);//  [0]表示不选择当前节点能偷盗的最大值, [1]表示选择当前节点能偷盗的最大值
        int[] right = dfs(root.right);
        int selected = root.val + left[0] + right[0];
        int notSelected = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);
        return new int[]{selected,notSelected};
    }
}
